package com.lap.framework.common.enums;

import com.lap.framework.common.dto.result.ErrorCode;
import lombok.Getter;

/**
 * 系统预设返回值枚举,需要做国际化的有如下
 *
 * <pre>
 *  success = 操作成功
 *  error.400=请求错误(400)
 *  error.401=请求过期或未授权(401)
 *  error.404=请求未发现(404)
 *  error.429=请求太过频繁，请稍后重试(429)
 *  error.430=提交中,请勿重复提交（430）
 *  error.450=参数校验失败，请检查参数（450）
 *  error.451=业务校验失败（451）
 *  error.452=数据已变更，请重新获取再提交（452）
 *
 *  error.500=内部处理出错，请稍后重试(500)
 *  error.503=服务可能已停止(503)
 *  error.504=系统压力过大，访问受限(504)
 *  error.505=系统远程调用失败(505)
 *  error.509=未知异常(509)
 * </pre>
 *
 * @author Shuisheng Lao(劳水生)
 * @version 0.0.1
 */
@Getter
public enum SystemCode implements ErrorCode {
  // 成功
  SUCCESS(200, "SYS-COMMONS-P2-200", "success"),

  // 客户端校验失败
  REQUEST_BAD(400, "SYS-COMMONS-P0-400", "error.400"),
  REQUEST_UNAUTHORIZED(401, "SYS-COMMONS-P0-401", "error.401"),
  REQUEST_NOT_FOUND(404, "SYS-COMMONS-P0-404", "error.404"),
  REQUEST_TOO_MANY(429, "SYS-COMMONS-P0-429", "error.429"),
  REQUEST_REPEAT(430, "SYS-COMMONS-P2-430", "error.430"),

  // 校验处理错误 450~499
  VALID_FAILURE(450, "SYS-COMMONS-P2-450", "error.450"),
  BIZ_FAILURE(451, "SYS-COMMONS-P1-451", "error.451"),
  OPTIMISTIC_LOCK(452, "SYS-COMMONS-P2-452", "error.452"),
  SYS_FAILURE(453, "SYS-COMMONS-P0-453", "error.453"),

  // 服务端错误 500~599//数据库连接失败
  SYS_ERROR(500, "SYS-COMMONS-P0-500", "error.500"),
  SYS_UNAVAILABLE(503, "SYS-COMMONS-P0-503", "error.503"),
  SYS_FALLBACK(504, "SYS-COMMONS-P0-504", "error.504"),
  SYS_REMOTE_CALL(505, "SYS-COMMONS-P0-505", "error.505"),
  SYS_UNKNOWN_ERROR(509, "SYS-COMMONS-P0-509", "error.509"),
  ;

  private final int externalCode;
  private final String internalCode;
  private final String messageKey;

  SystemCode(int externalCode, String internalCode, String messageKey) {
    this.externalCode = externalCode;
    this.internalCode = internalCode;
    this.messageKey = messageKey;
  }

  /**
   * 判断请求是否成功:外部状态=code
   *
   * @param code 状态码
   * @return 是否成功，成功返回true
   */
  public static boolean success(int code) {
    return SUCCESS.externalCode == code;
  }

  /**
   * 判断请求是否失败:外部状态!=code
   *
   * @param code 状态码
   * @return 是否失败，失败返回true
   */
  public static boolean failure(int code) {
    return !success(code);
  }
}
